
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>事务管理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>事务管理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">架构</div>
          <div class="card-question">MyBatis事务管理的基本架构是基于哪两个核心接口？它们各自的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">架构</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyBatis的事务管理基于 `Transaction` 接口和 `TransactionFactory` 接口。`Transaction` 接口定义了事务的基本操作方法，如 `commit`、`rollback` 和 `close`。`TransactionFactory` 则负责根据不同的环境（如JDBC、Spring）创建相应的 `Transaction` 实例。</div>
          </div>
          <div class="card-source">来源: 1. 事务管理的基本架构</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">MyBatis默认的事务实现类 `JdbcTransaction` 是如何执行提交和回滚操作的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`JdbcTransaction` 通过持有的 JDBC `Connection` 对象来执行事务操作。当 `commit()` 或 `rollback()` 方法被调用时，它会检查 `autoCommit` 标志。如果 `autoCommit` 为 false，它就会调用 `connection.commit()` 或 `connection.rollback()` 来提交或回滚事务。</div>
          </div>
          <div class="card-source">来源: 2. JdbcTransaction的实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">`SqlSession` 是如何实现事务控制的？它与 `Transaction` 接口之间是什么关系？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`SqlSession` 提供了 `commit()`、`rollback()` 和 `close()` 方法来手动控制事务。其实现类（如 `DefaultSqlSession`）内部持有一个 `Transaction` 对象的实例，当 `SqlSession` 的事务方法被调用时，它会委托（delegate）给其内部的 `Transaction` 对象的相应方法去执行实际的事务操作。</div>
          </div>
          <div class="card-source">来源: 3. SqlSession中的事务控制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在MyBatis中，`JdbcTransactionFactory` 的主要职责是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`JdbcTransactionFactory` 是一个工厂类，其主要职责是创建 `JdbcTransaction` 实例。它通过 `newTransaction()` 方法，根据传入的数据源（DataSource）、事务隔离级别（TransactionIsolationLevel）和自动提交设置（autoCommit），来创建一个配置好的 `JdbcTransaction` 对象。</div>
          </div>
          <div class="card-source">来源: 4. TransactionFactory的实现与事务的创建</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">MyBatis自身是否实现事务的传播机制？它如何处理事务隔离级别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyBatis本身不直接实现事务的传播机制，但这可以通过与Spring框架集成来完成。对于事务隔离级别，MyBatis通过 `TransactionIsolationLevel` 枚举来支持设置，这个级别可以在创建 `Transaction` 实例时指定。</div>
          </div>
          <div class="card-source">来源: 5. 事务的传播机制与隔离级别</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当MyBatis与Spring集成进行事务管理时，通常使用哪个类来替代默认的 `SqlSession`？它在事务处理上有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当与Spring集成时，通常使用 `SqlSessionTemplate` 类。它与默认 `SqlSession` 的主要不同在于，`SqlSessionTemplate` 将事务的提交和回滚操作委托给Spring的事务管理器（PlatformTransactionManager）来处理，从而实现了与Spring事务管理的无缝集成。</div>
          </div>
          <div class="card-source">来源: 6. MyBatis与Spring的事务管理集成</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">流程</div>
          <div class="card-question">请简述MyBatis中一个典型事务的完整执行流程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">流程</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">一个典型的事务流程包括五个步骤：1. **创建事务**：`SqlSessionFactory` 通过 `TransactionFactory` 创建一个 `Transaction` 实例。2. **执行SQL操作**：在 `SqlSession` 中执行数据库操作，此时事务保持打开。3. **提交事务**：调用 `SqlSession.commit()` 来提交事务。4. **回滚事务**：如果发生异常，则调用 `SqlSession.rollback()` 来回滚事务。5. **关闭事务**：操作完成后，调用 `SqlSession.close()` 来关闭事务并释放数据库连接。</div>
          </div>
          <div class="card-source">来源: 7. 事务的执行流程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">MyBatis的 `Transaction` 接口定义了哪些核心方法来管理事务生命周期？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`Transaction` 接口定义了三个核心方法来管理事务生命周期：`commit()` 用于提交事务，`rollback()` 用于回滚事务，以及 `close()` 用于关闭事务和相关资源（如数据库连接）。此外，它还包含获取数据库连接的方法。</div>
          </div>
          <div class="card-source">来源: 1. 事务管理的基本架构</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">架构</div>
          <div class="card-question">在 `DefaultSqlSession` 的实现中，它依赖哪两个关键组件来分别执行SQL和管理事务？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">架构</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`DefaultSqlSession` 依赖两个关键组件：一个是 `Executor`，负责执行具体的SQL操作；另一个是 `Transaction`，负责管理事务的生命周期，包括提交、回滚和关闭。</div>
          </div>
          <div class="card-source">来源: 3. SqlSession中的事务控制</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
